<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel='stylesheet' href='../rurple.css' type='text/css'>
<title>八进制,十六进制和二进制</title>
</head>
<body>
<h2 class="title">八进制,十六进制和二进制</h3>
<p><span class="warning">注:</span> 你不需要完全理解这一节的内容也可以继续学习Python。</p>
<p>在第36课中,我曾提到过如果你尝试其他的数字(而不是我使用的那一个)就有可能得到一些错误信息或者是其他意外的结果.这里有两个这样的例子:</p>
<pre>
&gt;&gt;&gt; 1,023
(1, 19)

&gt;&gt;&gt; 1,099
  File <span class="string">"&lt;input&gt;"</span>, line 1
    1, 099
         ^
语法错误:输入无效
</pre>
<p>发生这个错误的原因是,Python会把以"0"开始的任何数字解析成8进制数,也就是说这个数字的基数是8.</p>
<p>通常的数字,它们的基数为10,由10个最基本的数字组成："0,1,2,3,4,5,6,7,8 和 9". 比如数字"345",用10进制解析为:</p>
<pre>
345 = 3*100 + 4*10 + 5*1
或者
345 = 3*10*10 + 4*10 + 5*1
再或者
345 = 3*10**2 + 4*10**1 + 5*10**0
</pre>
<p><small>[如果你不明白第三个等式的意思,那意味着你还需要在学校里多学几年数学.我们之前已经介绍过"**"的含义.]</small>相比之下,以8为基数的数字由这8个数字组成:"0,1,2,3,4,5,6 和 7". 比如8进制的"23"(或者在Python中表示为"023")表示为:<p>
<pre>
023 = 2*8 + 3*1 = 16 + 3 = 19 (以10为基数)
</pre>
<p>这就解释了上面例子的第一个结果. 造成第二个结果的原因是, 8进制数中不可能出现数字"9".</p>
<p>很困惑吗?让我们来增加你的困惑,以期澄清所有的事情. 除了8进制和10进制, Python还可以解析16进制的数字(以16为基数).通常16进制数由这些基本元素组成:"0,1,23,4,5,6,7,8,9,a,b,c,d,e,f". 在Python中我们将"0x"放在数字前面以表示这是一个16进制的数,比如:</p>
<pre>
&gt;&gt;&gt; 0x33
51

&gt;&gt;&gt; 0xa
10

&gt;&gt;&gt; 0xf
15

&gt;&gt;&gt; 0x10
16

&gt;&gt;&gt; 0x111
273

&gt;&gt;&gt; 0x123
291
</pre>
<p>以最后一个数字为例,"0x123"的16进制表达式为:</p>
<pre>
0x123 = 1*16*16 + 2*16 + 3*1 = 256 + 32 + 3 = 291 (in base 10)
</pre>
<p>在16进制中,"a"是第10个元素,数值上相当于10进制中的"10",而"f"是第15个元素,数值上相当于10进制中的"15". 请确认你可以验证以上我给出的正确的结果.</p>
<p>在我们这一课结束之前,我再简单地介绍一下2进制数,也就是以2为基数的数字. 2进制数是由"0"和"1"两个元素组成的. 这里有几个关于2进制数以及它们转化成10进制数的例子:</p>
<pre>
101001 = 1*2**5 + 0*2**4 + 1*2**3 + 0*2**2 + 0*2**1 + 1*2**0
或者
101001 = 1*32 + 1*8 + 1*1 = 41 (10进制数)
</pre>
<p>2进制数非常重要,它们是计算机的<b>根本</b>. 原因非常简单且容易理解,简单的说就是:</p>
<p>想象一下灯泡和灯的开关. 当开关打开时,灯泡就变亮了,这是因为有电流经过它. 当开关关闭时,灯泡就灭了,因为这个时候没有电流通过. 只有这两种可能性. 通常我们表述为: 没有电流通过=0;有电流通过=1.</p>
<p>当然在计算机里没有灯泡, 而是许多微小的电线和开关<small>[以及其它不在我们讨论范围的不那么重要的电子元器件.]</small>计算机在某个确定的瞬间的状态以一组通了电流的电线给出(比如第13条,第15条,第17条,等等). 这可以表示一系列的0(未通电流)和1(接通电流). 这个状态对应于一个相应的2进制数! 计算机程序必须控制这些微小的开关来使得电流在计算机内的流通随时间而改变.</p>
<p>8是2的3次幂,因此8进制是计算机中表示自然数的另一种常用方法. 类似的还有16进制. 因为这两种表达方式对于我们来说更为简洁. 对于程序员而言, 16进制是10进制之后他们最为常用的表达方式. 在你开始要用Python来编写游戏的时候,你会用到它(16进制).</p>
<center>
<a href="../lessons_toc.htm"><img alt="home"  src="../../images/home.png"></a>
</center>
</body>
</html>
